<?php
namespace app\back\controller;


use app\back\model\AssortModel;
use app\back\model\WebModel;
use think\Request;



///网站管理
class Node extends AdminCommon
{

    ///渲染公共数据
    public function __construct(AssortModel $assortModel){
        parent::__construct();
        ///渲染页面
        $this->assign([
            'classDataList'=>$assortModel->getSearchDataList(),
        ]);
    }

    ///网站管理列表页
    public function index(Request $request,WebModel $webModel){
        ///筛选参数
        $class_id = $request->param('contrller',0,'intval');///{根据分类筛选}

        ///分页获取数据
        $list = $webModel->getPageIndexDataList($class_id);
        $page = $list->render();


        ///渲染页面
        $this->assign([
            'contrller'=>$class_id,
            'indexDataList'=>$list,
            'page'=>$page,
        ]);
        return view();
    }



    ///添加页面
    public function add(){
        return view();
    }
    ///添加操作
    public function addPost(Request $request,WebModel $webModel){
        $assort_id = $request->param('class_id',0,'intval');
        $web_title = $request->param('web_title','');
        $web_url = $request->param('web_url','');
        $web_description = $request->param('web_description','','cus_character_filter');
        $web_sort = $request->param('web_sort',0,'floatval');

        ///效验
        if(empty($web_title)){return think_json_encode(['status'=>2,'msg'=>'网站标题不能为空啊！']);}
        if(!filter_var($web_url,FILTER_VALIDATE_URL)){return think_json_encode(['status'=>2,'msg'=>'检查一下网站URL吧！']);}

        ///操作数据库
        try{
            ///数据入库
            $webModel->insert(compact('assort_id','web_title','web_url','web_description','web_sort'));
            return think_json_encode(['status'=>0,'msg'=>'操作成功！']);
        }catch(\Exception $e){
            trace($e->getMessage(),'error');
            return think_json_encode(['status'=>2,'msg'=>'操作出现异常，请检查啊！']);
        }


    }



    ///编辑页面
    public function edit(Request $request,WebModel $webModel){
        ///参数
        $data_id = $request->param('id',0,'intval');

        ///获取数据
        $web_data = $webModel->getLeftAssortOneData($data_id);
        ///渲染页面
        $this->assign([
            'web_data'=>$web_data,
            'json_web_data'=>think_json_encode($web_data),
        ]);
        return view();
    }
    ///编辑操作
    public function editPost(Request $request,WebModel $webModel){
        $assort_id = $request->param('class_id',0,'intval');
        $web_id = $request->param('web_id',0,'intval');
        $web_title = $request->param('web_title','');
        $web_url = $request->param('web_url','');
        $web_description = $request->param('web_description','','cus_character_filter');
        $web_sort = $request->param('web_sort',0,'floatval');
        $web_status = $request->param('web_status',0,'intval');

        ///效验
        if(!$request->isAjax()){return think_json_encode(['status'=>2,'msg'=>'修改已关闭，请谅解！']);}
        if(empty($web_title)){return think_json_encode(['status'=>2,'msg'=>'网站标题不能为空啊！']);}
        if(!filter_var($web_url,FILTER_VALIDATE_URL)){return think_json_encode(['status'=>2,'msg'=>'检查一下网站URL吧！']);}

        ///操作数据库
        try{
            ///修改数据
            $edit_res = $webModel->updateDataByID($web_id,compact('assort_id','web_title','web_url','web_description','web_sort','web_status'));
            if($edit_res == 1){
                return think_json_encode(['status'=>0,'msg'=>'修改成功！']);
            }
            return think_json_encode(['status'=>2,'msg'=>'修改失败,请检查是否没有操作！']);
        }catch(\Exception $e){
            trace($e->getMessage(),'error');
            return think_json_encode(['status'=>2,'msg'=>'修改出现异常，请检查啊！']);
        }
    }


    ///批量导入网站数据页面
    public function webBatch(){
        return view();
    }


    /***
     * 批量导入网站数据操作：
     * @param Request $request
     * @param AssortModel $assortModel
     * @param WebModel $webModel
     * @return mixed|string|void
     */
    public function webBatchPost(Request $request,AssortModel $assortModel,WebModel $webModel){
        set_time_limit(0);
        ///获取数据：获得前台提交的json数据，将json数据转换为数组，方便下一步操作
        $request->filter('');
        $client_batch_data_json = $request->param('batch_data',array());
        $client_batch_data_arr = json_decode($client_batch_data_json,true);
        $client_batch_data_len = count($client_batch_data_arr);

        ///后台过滤
        if(empty($client_batch_data_json) || $client_batch_data_len == 0){return think_json_encode(['status'=>2,'msg'=>'数据不能为空！']);}

        ///数据归类：将json转换后的数组数据进行归类，相同分类放到一个数组内，归类完毕后是一个三维数组，array('分类标题'=>[['分类标题','网站链接','网站标题']])
        $sort_arr = array();
        for($i=0;$i<$client_batch_data_len;$i++){
            $i_data = $client_batch_data_arr[$i];
            $index = $i_data ['分类标题'] ?? 'default';
            $sort_arr[$index][] = array_values($i_data);
        }


        ///从归类好的数组内获取文件指定的所有分类：key为所有的分类
        $class_title_arr = array_keys($sort_arr);


        ///获取数据库已经存在的分类标题,返回的结果集结构为{class_title=>class_id}
        $db_class_data_arr = $assortModel->getAssortDataByTitleArr($class_title_arr);
        $db_class_title_data = array_keys($db_class_data_arr);

        ///获得数据库不存在的分类标题，文件中的分类和数据库内的分类的差集就是不存在的分类
        $diff_arr = array_diff($class_title_arr,$db_class_title_data);
        try{
            if($diff_arr){
                ///将不存在分类入库
                $a = array();
                foreach($diff_arr as $v2){
                    $a[] = ['assort_title'=>$v2,'assort_description'=>$v2];
                }
                $assortModel->insertAll($a);
                ///重新获取分类标题的class_id
                $db_class_data_arr = $assortModel->getAssortDataByTitleArr($class_title_arr);
            }
        }catch(\Exception $e){
            trace($e->getMessage(),'error');
            return think_json_encode(['status'=>2,'msg'=>'出现异常，请检查啊！']);
        }

        ///组装网站数据并入库：第二层foreach遍历获得每项数据，然后根据分类标题获取分类id，过滤非空后组装成写入的格式
        try{
            $error_data_limit = 0;///不合格数据条数
            $success_data_limit = 0;///合格数据条数
            $unique_data_limit = 0;///重复数据条数
            foreach($sort_arr as $v3){
                $dt = array();
                $web_url = array();
                foreach($v3 as $v4){
                    $v4_0 = $v4[0] ?? '';///分类标题
                    $v4_1 = $v4[1] ?? '';///网站url
                    $v4_2 = $v4[2] ?? '';///网站标题
                    $assort_id = $db_class_data_arr[$v4_0] ?? 0;///分类id
                    if(empty($v4_0) || empty($v4_1) || empty($v4_2) || empty($assort_id)){$error_data_limit += 1;continue;}

                    $dt[] = array('assort_id'=>$assort_id,'web_url'=>$v4_1,'web_title'=>$v4_2,'web_description'=>$v4_2);
                    $web_url[] = $v4_1;
                }

                ///没有合格数据则跳出本次循环，不必再进行查重和入库操作
                if(empty($dt)){continue;}

                ///获取数据库内对应网站的数据
                $web_url_get_data =  $webModel->getWebDataByUrl($web_url);
                ///去重前
                $be = count($dt);
                ///去重；获得上传的数据在数据库内没有的数据
                $dt = array_udiff($dt,$web_url_get_data,"myfunction");
                ///去重后
                $af = count($dt);

                $unique_data_limit = $unique_data_limit + ($be - $af);

                ///入库操作
                if($dt){$res = $webModel->insertAll($dt);$success_data_limit = $success_data_limit+$res;}
            }

            return think_json_encode(['status'=>0,'msg'=>'上传成功：共上传'.$client_batch_data_len.'条数据；检测重复'.$unique_data_limit.'条数据；入库成功'.$success_data_limit.'条数据；不合格'.$error_data_limit.'条数据','url'=>'/'.ADMIN_ROUT_PREFIX.'/web-batch']);
        }catch(\Exception $e){
            trace($e->getMessage(),'error');
            return think_json_encode(['status'=>2,'msg'=>'出现异常，请检查啊！']);
        }
    }





}